use super::Word;

/// cpu trait， 其实cpu本身的逻辑是相对固定的，基本就是维护几个寄存器
/// 当然不同指令集架构还是有区别的，比如 riscv 存在一个特殊的 zero 寄存器
/// 后面也可能得考虑那些特殊的控制寄存器
pub trait Cpu<W: Word> {
    /// 写寄存器，认为值是无符号数
    fn set_reg(&mut self, idx: usize, value: W::UInt);
    /// 写寄存器，认为值是有符号数
    fn set_regi(&mut self, idx: usize, value: W::Int);
    /// 设置 pc
    fn set_pc(&mut self, value: W::UInt);
    /// 读取寄存器, 认为是无符号数
    fn reg(&self, idx: usize) -> W::UInt;
    /// 读取寄存器, 认为是有符号数
    fn regi(&self, idx: usize) -> W::Int;
    /// 读 pc
    fn pc(&self) -> W::UInt;
}
